package Classes;


import Classes.Estabelecimento;


/**
 * 
 * @author JAVA - LI
 *
 */
public class Opniao{
	private int nota;
	private Estabelecimento estabelecimento;
	private String comentario;
	
	/**
	 * Cria uma opniao de um usuario.
	 * @param restaurante Nome do restaurante.
	 * @param nota Nota dada ao restaurante.
	 * @param comentario Avaliacao dada ao restaurante.
	 * @throws Exception Lanca excessao de strings vazias.
	 */
	public Opniao(Estabelecimento estabelecimento, int nota, String comentario) throws Exception{
		if((nota<-5)||(nota>5)){
			throw new Exception("Nota fora dos parametros!");
		}
		if((comentario.replace(" ","").equals(""))||(comentario.equals(null))){
			throw new Exception("Comentario vazio ou nulo!");
		}
		if(!(estabelecimento instanceof Estabelecimento)){
			throw new Exception("Parametro: estabelecimento nao eh instancia!");
		}
		this.nota = nota;
		this.comentario = comentario;
		this.estabelecimento = estabelecimento;
	}
	
	/**
	 * Retorna o comentario relacionado a um restaurante.
	 * @return O comentario relacionado a um restaurante.
	 */
	public String getComentario() {
		return comentario;
	}
	
	/**
	 * Altera o comentario de uma opiniao.
	 * @param novoComentario O novo comentario da opiniao.
	 */
	public void setComentario(String novoComentario) {
		this.comentario = novoComentario;
	}
	
	/**
	 * Retorna o nome do estabelecimento.
	 * @return o nome do estabelecimento.
	 */
	public String getNomeEstabelecimento(){
		return estabelecimento.getNome();
	}
	
	/**
	 * Retorna um estabelecimento.
	 * @return Um estabelecimento.
	 */
	public Estabelecimento getEstabelecimento(){
		return estabelecimento;
	}
	
	/**
	 * Altera a nota atribuida a um restaurante.
	 * @param nota Nota atribuida a um restaurante.
	 */
	public void setNota(int nota){
		this.nota = nota;	
	}
	
	/**
	 * Retorna a nota dada a um restaurante.
	 * @return A nota dada a um restaurante.
	 */
	public int getNota(){
		return nota;
	}
	
	/**
	 * Altera a opniao de um dado estabelecimento.
	 * @param opi Nova opiniao.
	 * @return Um boolean.
	 */
    public boolean mudaOpniao(Opniao opi){
        if(estabelecimento.equals(opi.getEstabelecimento())){
            nota = opi.getNota();
            comentario = opi.getComentario();
            return true;
        }
        return false;
    }
	
	@Override
	/**
	 * Retorna um inteiro simbolizando o endereco de memoria.
	 */
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((comentario == null) ? 0 : comentario.hashCode());
		result = prime * result
				+ ((estabelecimento == null) ? 0 : estabelecimento.hashCode());
		result = prime * result + nota;
		return result;
	}

	@Override
	/**
	 * Retorna um boolean comparando se dois objetos forem iguais.
	 */
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Opniao other = (Opniao) obj;
		if (comentario == null) {
			if (other.comentario != null)
				return false;
		} else if (!comentario.equals(other.comentario))
			return false;
		if (estabelecimento == null) {
			if (other.estabelecimento != null)
				return false;
		} else if (!estabelecimento.equals(other.estabelecimento))
			return false;
		if (nota != other.nota)
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return nota+" : "+comentario ;
	}
}
